package org.example.lock;

/*
    volatile关键字主要有三方面作用：
        1.实现long/double类型变量的原子操作
        2.防止指令重排序
        3.实现变量的可见性

    volatile double a=1.0
        当使用volatile修饰变量时，应用就不会从寄存器中获取该变量的值，而是从内存(高速缓存)中获取。

    volatile与锁类似的地方有两点：
        1.确保变量的内存可见性
        2.防止指令重排序

        volatile可以确保对变量写操作的原子性，但不具备排他性
        另外的重要一点在于：使用锁可能会导致线程的上下文切换(内核态与用户态之间的切换),但使用volatile并不会出现这种情况

    volatile int a=b+2;
    volatile int a=a++;

    适应场景
    volatile int count =1;
    volatile boolean flag =false;

    如果要实现volatile写操作的原子性，那么在等号右侧的赋值变量中就不能出现被多线程所共享的变量，
    哪怕这个变量也是个volatile也不可以。

    防止指令重排序与实现变量的可见性都是通过一种手段来实现的：内存屏障(memory barrier)
      指令重排序是编译器为了优化程序性能而进行的一种指令重新排序，在单线程情况下，指令重排序不会有问题，但在多线程情况下可能会产生问题
      volatile关键字可以防止编译器对涉及volatile变量的指令进行重排序

      1.对于读取操作来说，volatile可以确保该操作与其后续的所有读写操作都不会进行指令重排序。
      2.对于修改操作来说，volatile可以确保该操作与其上面的所有读写操作都不会进行指令重排序。

* * */

public class volatileSty {
}
